#include <iostream>
#include <cstdio>
using namespace std;

int add(int a,int b)
//int add(int m,int n)    不是重载，原因参数名字不一样是忽悠人的
//float add(int a,int b)  不是重载，原因是函数重载不关心返回值类型
//float add(int a,float b)  是重载
//float add(float a,int b)  是重载
{
	printf("第一个版本的add!\n");
	return a+b;
}

float add(float a,float b)
{
	printf("第二个版本的add!\n");
	return a+b;
}

double add(int a,float b)
{
	printf("第三个版本的add!\n");
	return a+b;
}









int main()
{
	//重点理解编译器如何区分不同版本的add
	//原理：从左到右去检查实参的个数和类型有没有完全匹配的，没有就报错
	int a=15;
	int b=46;
	float c=45.6;
	float d=89;
	//调用第一个版本的add
	cout<<add(a,b)<<endl;
	
	//调用第二个版本的add
	cout<<add(c,d)<<endl;
	
	cout<<add(a,c)<<endl;
}